home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 7 / BBS in a Box - Macintosh - Volume VII (BBS in a Box) (January 1993).iso / Files / Hyper / Me-Mz / Memory Tools.cpt / Memory Tools / card_11272.txt < prev    next >
Text File  |  1989-01-07  |  5KB  |  109 lines

  1. -- card: 11272 from stack: in
  2. -- bmap block id: 3785
  3. -- flags: 0000
  4. -- background id: 12278
  5. -- name: disasm
  6.  
  7.  
  8. -- part 6 (button)
  9. -- low flags: 00
  10. -- high flags: A003
  11. -- rect: left=326 top=56 right=78 bottom=426
  12. -- title width / last selected line: 0
  13. -- icon id / first selected line: 0 / 0
  14. -- text alignment: 1
  15. -- font id: 0
  16. -- text size: 12
  17. -- style flags: 0
  18. -- line height: 16
  19. -- part name: Disassemble
  20. ----- HyperTalk script -----
  21. on mouseUp
  22.   put empty into  field "data"
  23.   show  field "data"
  24.   set the scroll of field "data" to 0
  25.   ask "Disassemble starting At " with "400200"
  26.   if it is empty then
  27.     hide  field "data"
  28.     exit mouseup
  29.   end if
  30.   put it into address
  31.   put address into  field "data"
  32.   repeat with i=1 to 2
  33.     put disasm(address,L) after  field "data"
  34.     put last word of field "data" into address
  35.   end repeat
  36.   put " click the mouse to exit demo" after field "data"
  37.   wait until the mouseclick
  38.   hide field  "data"
  39. end mouseUp
  40.  
  41.  
  42.  
  43. -- part contents for background part 68
  44. ----- text -----
  45. DisAsm is the principal XFCN included in this stack. It returns the 68000 instruction stored at a given address. It has a few other useful options as well. In its simplest form, DisAsm can be used to just look at the instruction stored at a given location. For example, if you write
  46.  
  47.       put DisAsm("411000") into field "Data"
  48.  
  49. then (on a Mac Plus) the field data will get the value:  
  50. MOVEM.L (A7)+, D0/D1/D2
  51. (Go ahead and try DisAsm("411000") from the message box)
  52.  
  53. However, you will generally want to use DisAsm to look at the assembly language instructions stored in several consecutive locations. So that it will be straightforward to write a script to disassemble a linear range of addresses, DisAsm contains several options. 
  54.  
  55. First, you can add a second parameter (an L is used here, but any second parameter would serve as well). If DisAsm sees a second parameter, then it will return the 8 instructions stored starting at the given address. It returns these instructions in the following format
  56.  
  57. instruction  (return)
  58. next address  instruction (return)
  59. next address  instruction (return)
  60. next address  instruction (return)
  61. next address  instruction (return)
  62. next address  instruction (return)
  63. next address  instruction (return)
  64. next address  instruction (return)
  65. next address
  66.  
  67. This makes it fairly simple to write a script that will quickly disassemble a long  range of addresses.
  68.  
  69. See the demo provided on this card as an example. Also see the script of the card "disassembler" for a more elaborate (and typical) useage of the DisAsm XFCN.
  70.  
  71. If a third parameter is included with the DisAsm XFCN
  72.  e.g. DisAsm(Address,L,L)
  73. then the result returned consists of eight lines (as above) but some extra formatting gets thrown in too. For instance a carriage return is appended after any instruction of the form BRA, RTS, or JMP. This makes it easier to see exactly where the code segment breaks into "pieces".
  74.  
  75. As with the other XFCN's in this stack, the address provided to DisAsm can either be included in quotes or may begin with an H to signify that it is a hexadecimal value. I suggest that you generally use the option of preceeding addresses with an H to avoid complaints from Hypercard.
  76.  
  77. DisAsm expects to get an even address, but if you supply an odd address, then DisAsm will simply add one to make it even. If the address is not a legal hexstring, then DisAsm returns an empty string.
  78.  
  79. Comments on What You Will See
  80. Note that an instruction such as MOVE.L D2,-(A7) is changed to PUSH.L D2 - which is more nmemonic and represents a standard maco on many assemblers. Recall that A7 is used as the stack pointer. 
  81.  
  82. Similarly,  MOVE.W (A7)+,D3  will appear as POP.W D3.
  83.  
  84. Also, ALL numerical values returned by DisAsm are hexadecimal.  You can use the HexToDec XFCN to convert some of these to decimal values if you like.
  85.  
  86. Note that DisAsm converts all trapwords to their symbolic name as given in Inside Macintosh.
  87.  
  88. If you can't think of anything to disassemble, try looking at some traps. Go to the disassembler card, choose the traps option and ask for MenuSelect (or whatever trap you like). 
  89.  
  90.  
  91. -- part contents for background part 69
  92. ----- text -----
  93. 0  NEGX.L  D1
  94. 2  ORI.B  #80,D0
  95. 6  MOVE.L  (A4),D5
  96. 8  NEGX.L  D0
  97. A  MOVE.L  408C(PC),(A0)+
  98. E  MOVE.L  #408020FE,(A0)+
  99. 14  NEGX.L  D0
  100. 16  MOVE.L  D0,-(A0)
  101. 18  NEGX.L  D0
  102. 1A  MOVE.L  D2,-(A0)
  103. 1C  NEGX.L  D0
  104. 1E  MOVE.L  D4,-(A0)
  105. 20  NEGX.L  D0
  106. 22  MOVE.L  D6,-(A0)
  107. 24  NEGX.L  D0
  108. 26  MOVE.L  A0,-(A0)
  109. 28 click the mouse to exit demo